package cn.tedu.reflect;

import com.sun.corba.se.spi.ior.iiop.MaxStreamFormatVersionComponent;

import javax.swing.text.html.CSS;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Test2 {
    public static void main(String[] args) throws Exception {
 //       method();//获取class对象
 //       method2();//获取构造方法
  //      method3();//获取成员方法
  //      method4();//获取成员变量
        method5();//通过反射的技术创建对象

    }
    //创建对象
    public static void method5() throws Exception {
        //获取class对象
        Class<Student> claazz=Student.class;
        //调用实例化方法--也要触发结构方法，而且触发的是无参构造
        Student s=claazz.newInstance();
        System.out.println("s = " + s);
        //怎么触发含参构造--先指定
        //getConstructor(m)--m参数要匹配构造方法里 参数类型 的class对象
        Constructor<Student> c = claazz.getConstructor(String.class);
        //newInstance(x)--x是你创建对象时具体的参数
        Student s2 = c.newInstance("jack");
        System.out.println("s2 = " + s2);
        Constructor<Student> c2 = claazz.getConstructor(String.class, int.class);
        Student s3 = c2.newInstance("rose", 15);
        System.out.println("s3 = " + s3);

    }


    //
    public static void method4() {
        //
        Class a=Student.class;
        //获取所有成员变量--只能获取公开的变量
        Field[] fs = a.getFields();
        for (Field f : fs) {
            System.out.println(f.getName());
            System.out.println(f.getType().getName());

        }
    }

    public static void method3() {
        //获取class对象
        Class a=Student.class;
        //获取所有成员方法--包括自己的和父类的的公开的方法
        Method[] ms = a.getMethods();
        //遍历数组，得到每个方法m
        for (Method m : ms) {
            //获取方法名称
            System.out.println(m.getName());
            //获取方法的参数
            Class<?>[] cs = m.getParameterTypes();
            System.out.println(Arrays.toString(cs));
        }

    }
//获取构造方法
    public static void method2() {
        //获取class对象--封装了.class文件里的所有数据
        Class a=Student.class;
        //获取每个构造方法
        Constructor[] cs=a.getConstructors();
        //获取每个构造方法c
        for (Constructor c : cs) {
            //获取构造方法的名字
            System.out.println(c.getName());
            //获取构造方法的参数类型们
            Class[] css = c.getParameterTypes();
            System.out.println(Arrays.toString(css));
        }
    }

    //获取class对象
    public static void method() throws ClassNotFoundException {
        Class a=Class.forName("cn.tedu.reflect.Student");
        Class a2=Student.class;
        Class a3=new Student().getClass();
        System.out.println("a="+a);
        System.out.println("a2 = " + a2);
        System.out.println("a3 = " + a3);

    }
}
